Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_module_ownership_contract.py

Displaying Raw • Download


tests/backend/test_module_ownership_contract.py dev (af76f09d) Text, 3.73 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Contract test: docs/agents/module-ownership.md Backend table vs files on disk.

Parses the Backend table directly from the doc so the checked-in fixture
drifts loudly (via a failing diff) whenever a row is added, removed, or
retyped, then asserts every manager module, HTTP route module, WS module,
and frontend page path referenced by the table actually exists. Primary
tests cells are prose-heavy, so only glob-like spans are checked, and only
one matching test file per row is required since a row often lists several
loosely related test names.
"""

Tff7b72import T7ee787glob
Tff7b72import T7ee787os
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path

Tff7b72import T7ee787pytest

Tff7b72from T7ee787testsT7ee787.T7ee787backendT7ee787.T7ee787module_ownership_contract_helpers Tff7b72import Tb4b4b4(
Te6edf3load_ownership_fixtureTb4b4b4,
Te6edf3parse_backend_ownership_tableTb4b4b4,
Te6edf3resolve_frontend_page_pathsTb4b4b4,
Te6edf3resolve_http_route_pathsTb4b4b4,
Te6edf3resolve_manager_module_pathsTb4b4b4,
Te6edf3resolve_ws_module_pathsTb4b4b4,
Te6edf3write_ownership_fixtureTb4b4b4,
Tb4b4b4)

Te6edf3_REPO_ROOT Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3_DOC_PATH Tff7b72= Te6edf3_REPO_ROOT Tff7b72/ Ta5d6ff"Ta5d6ffdocsTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffagentsTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffmodule-ownership.mdTa5d6ff"
Te6edf3_FIXTURE Tff7b72= Tb4b4b4(
Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparent Tff7b72/ Ta5d6ff"Ta5d6fffixturesTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffbackend_module_ownership.jsonTa5d6ff"
Tb4b4b4)
Te6edf3_TESTS_BACKEND_DIR Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparent


Tff7b72def Td2a8fftest_backend_ownership_table_matches_fixtureTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3parsed Tff7b72= Te6edf3parse_backend_ownership_tableTb4b4b4(Te6edf3_DOC_PATHTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffUPDATE_BACKEND_MODULE_OWNERSHIPTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4:
Te6edf3write_ownership_fixtureTb4b4b4(Te6edf3_FIXTURETb4b4b4, Te6edf3parsedTb4b4b4)
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(
Ta5d6ff"Ta5d6ffUPDATE_BACKEND_MODULE_OWNERSHIP=1: fixture updated; re-run without the env varTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3expected Tff7b72= Te6edf3load_ownership_fixtureTb4b4b4(Te6edf3_FIXTURETb4b4b4)
Tff7b72assert Te6edf3parsed Tff7b72== Te6edf3expectedTb4b4b4, Tb4b4b4(
Ta5d6ff"Ta5d6ffBackend module ownership table drifted from the checked-in fixture. Ta5d6ff"
Ta5d6ff"Ta5d6ffIf the docs/agents/module-ownership.md Backend table changed on purpose, run: Ta5d6ff"
Ta5d6ff"Ta5d6ffUPDATE_BACKEND_MODULE_OWNERSHIP=1 uv run pytest tests/backend/test_module_ownership_contract.py -k Ta5d6ff"
Ta5d6ff"Ta5d6ffbackend_ownership_table_matches_fixtureTa5d6ff"
Tb4b4b4)


Tff7b72def Td2a8ff_assert_paths_existTb4b4b4(Te6edf3rowsTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4]Tb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3resolverTb4b4b4, Te6edf3labelTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3row Tff7b72in Te6edf3rowsTb4b4b4:
Tff7b72for Te6edf3rel_pathTb4b4b4, Te6edf3kind Tff7b72in Te6edf3resolverTb4b4b4(Te6edf3rowTb4b4b4[Te6edf3keyTb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3full Tff7b72= Te6edf3_REPO_ROOT Tff7b72/ Te6edf3rel_path
Te6edf3exists Tff7b72= Te6edf3fullTff7b72.Td2a8ffis_dirTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3kind Tff7b72== Ta5d6ff"Ta5d6ffdirTa5d6ff" Tff7b72else Te6edf3fullTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3existsTb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3rowTb4b4b4[Ta5d6ff'Ta5d6ffdomainTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff: Tffd700{Te6edf3labelTffd700}Ta5d6ff path missing on disk: Tffd700{Te6edf3rel_pathTffd700}Ta5d6ff"


Tff7b72def Td2a8fftest_manager_modules_exist_on_diskTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3rows Tff7b72= Te6edf3load_ownership_fixtureTb4b4b4(Te6edf3_FIXTURETb4b4b4)
Te6edf3_assert_paths_existTb4b4b4(
Te6edf3rowsTb4b4b4, Ta5d6ff"Ta5d6ffmanager_modulesTa5d6ff"Tb4b4b4, Te6edf3resolve_manager_module_pathsTb4b4b4, Ta5d6ff"Ta5d6ffmanager moduleTa5d6ff"
Tb4b4b4)


Tff7b72def Td2a8fftest_http_route_modules_exist_on_diskTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3rows Tff7b72= Te6edf3load_ownership_fixtureTb4b4b4(Te6edf3_FIXTURETb4b4b4)
Te6edf3_assert_paths_existTb4b4b4(
Te6edf3rowsTb4b4b4, Ta5d6ff"Ta5d6ffhttp_route_moduleTa5d6ff"Tb4b4b4, Te6edf3resolve_http_route_pathsTb4b4b4, Ta5d6ff"Ta5d6ffHTTP route moduleTa5d6ff"
Tb4b4b4)


Tff7b72def Td2a8fftest_ws_modules_exist_on_diskTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3rows Tff7b72= Te6edf3load_ownership_fixtureTb4b4b4(Te6edf3_FIXTURETb4b4b4)
Te6edf3_assert_paths_existTb4b4b4(Te6edf3rowsTb4b4b4, Ta5d6ff"Ta5d6ffws_moduleTa5d6ff"Tb4b4b4, Te6edf3resolve_ws_module_pathsTb4b4b4, Ta5d6ff"Ta5d6ffWS moduleTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_frontend_pages_exist_on_diskTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3rows Tff7b72= Te6edf3load_ownership_fixtureTb4b4b4(Te6edf3_FIXTURETb4b4b4)
Te6edf3_assert_paths_existTb4b4b4(
Te6edf3rowsTb4b4b4, Ta5d6ff"Ta5d6fffrontend_pageTa5d6ff"Tb4b4b4, Te6edf3resolve_frontend_page_pathsTb4b4b4, Ta5d6ff"Ta5d6fffrontend pageTa5d6ff"
Tb4b4b4)


Tff7b72def Td2a8ff_looks_like_test_globTb4b4b4(Te6edf3spanTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Te6edf3spanTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6fftest_Ta5d6ff"Tb4b4b4)


Tff7b72def Td2a8fftest_primary_tests_glob_patterns_match_at_least_one_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3rows Tff7b72= Te6edf3load_ownership_fixtureTb4b4b4(Te6edf3_FIXTURETb4b4b4)
Tff7b72for Te6edf3row Tff7b72in Te6edf3rowsTb4b4b4:
Te6edf3globs Tff7b72= Tb4b4b4[Te6edf3span Tff7b72for Te6edf3span Tff7b72in Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffprimary_testsTa5d6ff"Tb4b4b4] Tff7b72if Te6edf3_looks_like_test_globTb4b4b4(Te6edf3spanTb4b4b4)Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3globsTb4b4b4:
Tff7b72continue
Te6edf3matched Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3pattern Tff7b72in Te6edf3globsTb4b4b4:
Te6edf3matchedTff7b72.Td2a8ffextendTb4b4b4(
Te6edf3globTff7b72.Td2a8ffglobTb4b4b4(Tffa657strTb4b4b4(Te6edf3_TESTS_BACKEND_DIR Tff7b72/ Ta5d6ff"Ta5d6ff**Ta5d6ff" Tff7b72/ Te6edf3patternTb4b4b4)Tb4b4b4, Te6edf3recursiveTff7b72=Tff7b72TrueTb4b4b4)
Tb4b4b4)
Tff7b72assert Te6edf3matchedTb4b4b4, Tb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Te6edf3rowTb4b4b4[Ta5d6ff'Ta5d6ffdomainTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff: none of Tffd700{Te6edf3globsTffd700}Ta5d6ff matched a file under tests/backend/Ta5d6ff"
Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────